From 8d9a92196101f5ce538636780b42ea6b5ee85d4a Mon Sep 17 00:00:00 2001 From: tsteven4 Date: Sun, 11 Aug 2013 20:51:01 +0000 Subject: [PATCH] standardize gpx and kml writers using dynamically allocated files and writers. git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4529 f51c46e8-681c-474f-0cfe-069cfd0219fb --- gpsbabel/garmin_fs.cc | 42 +++--- gpsbabel/garmin_fs.h | 2 +- gpsbabel/gpx.cc | 200 ++++++++++++++-------------- gpsbabel/kml.cc | 20 ++- gpsbabel/src/core/xmlstreamwriter.h | 4 +- 5 files changed, 140 insertions(+), 128 deletions(-) diff --git a/gpsbabel/garmin_fs.cc b/gpsbabel/garmin_fs.cc index 156669bb7..86110f949 100644 --- a/gpsbabel/garmin_fs.cc +++ b/gpsbabel/garmin_fs.cc @@ -179,7 +179,7 @@ void garmin_fs_convert(void* fs) void garmin_fs_xml_fprint(const waypoint* waypt, - QXmlStreamWriter& writer) + QXmlStreamWriter* writer) { const char* phone, *addr; garmin_fs_t* gmsd = GMSD_FIND(waypt); @@ -211,18 +211,18 @@ garmin_fs_xml_fprint(const waypoint* waypt, WAYPT_HAS(waypt, proximity) || WAYPT_HAS(waypt, temperature) || gmsd->flags.display) { - writer.writeStartElement("extensions"); - writer.writeStartElement("gpxx:WaypointExtension"); - writer.writeNamespace("http://www.garmin.com/xmlschemas/GpxExtensions/v3", + writer->writeStartElement("extensions"); + writer->writeStartElement("gpxx:WaypointExtension"); + writer->writeNamespace("http://www.garmin.com/xmlschemas/GpxExtensions/v3", "gpxx"); if WAYPT_HAS(waypt, proximity) { - writer.writeTextElement("gpxx:Proximity", QString::number(waypt->proximity, 'f', 6)); + writer->writeTextElement("gpxx:Proximity", QString::number(waypt->proximity, 'f', 6)); } if WAYPT_HAS(waypt, temperature) { - writer.writeTextElement("gpxx:Temperature", QString::number(waypt->temperature, 'f', 6)); + writer->writeTextElement("gpxx:Temperature", QString::number(waypt->temperature, 'f', 6)); } if WAYPT_HAS(waypt, depth) { - writer.writeTextElement("gpxx:Depth", QString::number(waypt->depth, 'f', 6)); + writer->writeTextElement("gpxx:Depth", QString::number(waypt->depth, 'f', 6)); } if (gmsd->flags.display) { const char* cx; @@ -237,48 +237,48 @@ garmin_fs_xml_fprint(const waypoint* waypt, cx = "SymbolAndName"; break; } - writer.writeTextElement("gpxx:DisplayMode", cx); + writer->writeTextElement("gpxx:DisplayMode", cx); } if (gmsd->flags.category && gmsd->category) { int i; uint16_t cx = gmsd->category; - writer.writeStartElement("gpxx:Categories"); + writer->writeStartElement("gpxx:Categories"); for (i = 0; i < 16; i++) { if (cx & 1) { - writer.writeTextElement("gpxx:Category", QString("Category %1").arg(i+1)); + writer->writeTextElement("gpxx:Category", QString("Category %1").arg(i+1)); } cx = cx >> 1; } - writer.writeEndElement(); // gpxx:Categories + writer->writeEndElement(); // gpxx:Categories } if (*addr) { char* str; - writer.writeStartElement("gpxx:Address"); + writer->writeStartElement("gpxx:Address"); if ((str = GMSD_GET(addr, NULL))) { - writer.writeTextElement("gpxx:StreetAddress", str); + writer->writeTextElement("gpxx:StreetAddress", str); } if ((str = GMSD_GET(city, NULL))) { - writer.writeTextElement("gpxx:City", str); + writer->writeTextElement("gpxx:City", str); } if ((str = GMSD_GET(state, NULL))) { - writer.writeTextElement("gpxx:State", str); + writer->writeTextElement("gpxx:State", str); } if ((str = GMSD_GET(country, NULL))) { - writer.writeTextElement("gpxx:Country", str); + writer->writeTextElement("gpxx:Country", str); } if ((str = GMSD_GET(postal_code, NULL))) { - writer.writeTextElement("gpxx:PostalCode", str); + writer->writeTextElement("gpxx:PostalCode", str); } - writer.writeEndElement(); // /gpxx::Address + writer->writeEndElement(); // /gpxx::Address } if (*phone) { - writer.writeTextElement("gpxx:PhoneNumber", phone); + writer->writeTextElement("gpxx:PhoneNumber", phone); } - writer.writeEndElement(); // /gpxx::WaypointExtension - writer.writeEndElement(); // /extensions. + writer->writeEndElement(); // /gpxx::WaypointExtension + writer->writeEndElement(); // /extensions. } } diff --git a/gpsbabel/garmin_fs.h b/gpsbabel/garmin_fs.h index 94d5bbad0..bc25947e7 100644 --- a/gpsbabel/garmin_fs.h +++ b/gpsbabel/garmin_fs.h @@ -123,7 +123,7 @@ char* garmin_fs_xstrdup(const char* src, size_t size); /* for GPX */ void garmin_fs_xml_convert(const int base_tag, int tag, const char* cdatastr, waypoint* waypt); class QXmlStreamWriter; -void garmin_fs_xml_fprint(const waypoint* waypt, QXmlStreamWriter&); +void garmin_fs_xml_fprint(const waypoint* waypt, QXmlStreamWriter*); /* common garmin_fs utilities */ diff --git a/gpsbabel/gpx.cc b/gpsbabel/gpx.cc index 582fcbd05..cb4688cb6 100644 --- a/gpsbabel/gpx.cc +++ b/gpsbabel/gpx.cc @@ -57,8 +57,8 @@ static int cache_descr_is_html; static gbfile* fd; static const char* input_fname; static gbfile* ofd = NULL; -static QFile oqfile; -static gpsbabel::XmlStreamWriter writer(oqfile); +static QFile* oqfile; +static gpsbabel::XmlStreamWriter* writer; static short_handle mkshort_handle; static const char* link_url; static char* link_text; @@ -284,17 +284,17 @@ gpx_write_gdata(gpx_global_entry* ge, const char* tag) if (!gpx_global || QUEUE_EMPTY(&ge->queue)) { return; } - writer.writeStartElement(tag); + writer->writeStartElement(tag); QUEUE_FOR_EACH(&ge->queue, elem, tmp) { gep = BASE_STRUCT(elem, gpx_global_entry, queue); - writer.writeCharacters(gep->tagdata); + writer->writeCharacters(gep->tagdata); /* Some tags we just output once. */ if ((0 == strcmp(tag, "url")) || (0 == strcmp(tag, "email"))) { break; } } - writer.writeEndElement(); + writer->writeEndElement(); } @@ -1365,18 +1365,24 @@ gpx_wr_init(const char* fname) mkshort_handle = NULL; // QFile requires binary mode on Windows. ofd = gbfopen(fname, "wb", MYNAME); - oqfile.open(ofd->handle.std, QIODevice::WriteOnly); + oqfile = new QFile; + oqfile->open(ofd->handle.std, QIODevice::WriteOnly); - writer.setAutoFormattingIndent(2); - writer.setCodec("UTF-8"); - writer.writeStartDocument(); + writer = new gpsbabel::XmlStreamWriter(oqfile); + writer->setAutoFormattingIndent(2); + writer->setCodec("UTF-8"); + writer->writeStartDocument(); } static void gpx_wr_deinit(void) { - writer.writeEndDocument(); - oqfile.close(); + writer->writeEndDocument(); + delete writer; + writer = NULL; + oqfile->close(); + delete oqfile; + oqfile = NULL; gbfclose(ofd); ofd = NULL; @@ -1424,7 +1430,7 @@ write_tag_attributes(xml_tag* tag) pa = tag->attributes; if (pa) { while (*pa) { - writer.writeAttribute(pa[0], pa[1]); + writer->writeAttribute(pa[0], pa[1]); pa += 2; } } @@ -1434,33 +1440,33 @@ static void fprint_xml_chain(xml_tag* tag, const waypoint* wpt) { while (tag) { - writer.writeStartElement(tag->tagname); + writer->writeStartElement(tag->tagname); if (!tag->cdata && !tag->child) { write_tag_attributes(tag); // No children? Self-closing tag. - writer.writeEndElement(); + writer->writeEndElement(); } else { write_tag_attributes(tag); if (tag->cdata) { - writer.writeCharacters(tag->cdata); + writer->writeCharacters(tag->cdata); } if (tag->child) { fprint_xml_chain(tag->child, wpt); } if (wpt && wpt->gc_data->exported.isValid() && strcmp(tag->tagname, "groundspeak:cache") == 0) { - writer.writeTextElement("time", + writer->writeTextElement("time", wpt->gc_data->exported.toPrettyString()); } - writer.writeEndElement(); + writer->writeEndElement(); } if (tag->parentcdata) { // FIXME: The length check is necessary to get line endings correct in our test suite. // Writing the zero length string eats a newline, at least with Qt 4.6.2. if (tag->parentcdatalen > 0) { - writer.writeCharacters(tag->parentcdata); + writer->writeCharacters(tag->parentcdata); } } tag = tag->sibling; @@ -1513,16 +1519,16 @@ write_gpx_url(const waypoint* waypointp) if (gpx_wversion_num > 10) { foreach(UrlLink l, waypointp->GetUrlLinks()) { - writer.writeStartElement("link"); - writer.writeAttribute("href", l.url_); - writer.writeOptionalTextElement("text", l.url_link_text_); - writer.writeEndElement(); + writer->writeStartElement("link"); + writer->writeAttribute("href", l.url_); + writer->writeOptionalTextElement("text", l.url_link_text_); + writer->writeEndElement(); } return; } UrlLink l = waypointp->GetUrlLink(); - writer.writeTextElement("url", QString(urlbase) + QString(l.url_)); - writer.writeOptionalTextElement("urlname", QString(l.url_link_text_)); + writer->writeTextElement("url", QString(urlbase) + QString(l.url_)); + writer->writeOptionalTextElement("urlname", QString(l.url_link_text_)); } /* @@ -1558,19 +1564,19 @@ gpx_write_common_acc(const waypoint* waypointp) } if (fix) { - writer.writeTextElement("fix", fix); + writer->writeTextElement("fix", fix); } if (waypointp->sat > 0) { - writer.writeTextElement("sat", QString::number(waypointp->sat)); + writer->writeTextElement("sat", QString::number(waypointp->sat)); } if (waypointp->hdop) { - writer.writeTextElement("hdop", toString(waypointp->hdop)); + writer->writeTextElement("hdop", toString(waypointp->hdop)); } if (waypointp->vdop) { - writer.writeTextElement("vdop", toString(waypointp->vdop)); + writer->writeTextElement("vdop", toString(waypointp->vdop)); } if (waypointp->pdop) { - writer.writeTextElement("pdop", toString(waypointp->pdop)); + writer->writeTextElement("pdop", toString(waypointp->pdop)); } } @@ -1579,10 +1585,10 @@ static void gpx_write_common_position(const waypoint* waypointp) { if (waypointp->altitude != unknown_alt) { - writer.writeTextElement("ele", QString::number(waypointp->altitude, 'f', 6)); + writer->writeTextElement("ele", QString::number(waypointp->altitude, 'f', 6)); } QString t = waypointp->CreationTimeXML(); - writer.writeOptionalTextElement("time", t); + writer->writeOptionalTextElement("time", t); } static void @@ -1592,14 +1598,14 @@ gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type poin if ((opt_humminbirdext && (WAYPT_HAS(waypointp, depth) || WAYPT_HAS(waypointp, temperature))) || (opt_garminext && gpxpt_waypoint==point_type && (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth))) || (opt_garminext && gpxpt_track==point_type && (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth) || waypointp->heartrate != 0 || waypointp->cadence != 0))) { - writer.writeStartElement("extensions"); + writer->writeStartElement("extensions"); if (opt_humminbirdext) { if (WAYPT_HAS(waypointp, depth)) { - writer.writeTextElement("h:depth", toString(waypointp->depth * 100.0)); + writer->writeTextElement("h:depth", toString(waypointp->depth * 100.0)); } if (WAYPT_HAS(waypointp, temperature)) { - writer.writeTextElement("h:temperature", toString(waypointp->temperature)); + writer->writeTextElement("h:temperature", toString(waypointp->temperature)); } } @@ -1611,14 +1617,14 @@ gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type poin switch (point_type) { case gpxpt_waypoint: if (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth)) { - writer.writeStartElement("gpxx:WaypointExtension"); + writer->writeStartElement("gpxx:WaypointExtension"); if (WAYPT_HAS(waypointp, temperature)) { - writer.writeTextElement("gpxx:Temperature", toString(waypointp->temperature)); + writer->writeTextElement("gpxx:Temperature", toString(waypointp->temperature)); } if (WAYPT_HAS(waypointp, depth)) { - writer.writeTextElement("gpxx:Depth", toString(waypointp->depth)); + writer->writeTextElement("gpxx:Depth", toString(waypointp->depth)); } - writer.writeEndElement(); // "gpxx:WaypointExtension" + writer->writeEndElement(); // "gpxx:WaypointExtension" } break; case gpxpt_route: @@ -1627,33 +1633,33 @@ gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type poin case gpxpt_track: if (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth) || waypointp->heartrate != 0 || waypointp->cadence != 0) { // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension. - writer.writeStartElement("gpxtpx:TrackPointExtension"); + writer->writeStartElement("gpxtpx:TrackPointExtension"); if (WAYPT_HAS(waypointp, temperature)) { - writer.writeTextElement("gpxtpx:atemp", toString(waypointp->temperature)); + writer->writeTextElement("gpxtpx:atemp", toString(waypointp->temperature)); } if (WAYPT_HAS(waypointp, depth)) { - writer.writeTextElement("gpxtpx:depth", toString(waypointp->depth)); + writer->writeTextElement("gpxtpx:depth", toString(waypointp->depth)); } if (waypointp->heartrate != 0) { - writer.writeTextElement("gpxtpx:hr", QString::number(waypointp->heartrate)); + writer->writeTextElement("gpxtpx:hr", QString::number(waypointp->heartrate)); } if (waypointp->cadence != 0) { - writer.writeTextElement("gpxtpx:cad", QString::number(waypointp->cadence)); + writer->writeTextElement("gpxtpx:cad", QString::number(waypointp->cadence)); } - writer.writeEndElement(); // "gpxtpx:TrackPointExtension" + writer->writeEndElement(); // "gpxtpx:TrackPointExtension" } break; } } - writer.writeEndElement(); // "extensions" + writer->writeEndElement(); // "extensions" } } static void gpx_write_common_description(const waypoint* waypointp, QString oname) { - writer.writeOptionalTextElement("name", oname); + writer->writeOptionalTextElement("name", oname); // FIXME: the replace() nonsense here is to prevent bogus control // characters from being embedded in the output stream. The only place @@ -1663,18 +1669,18 @@ gpx_write_common_description(const waypoint* waypointp, QString oname) QString desc = QString::fromUtf8(waypointp->description); desc = desc.replace(QRegExp("[\014-\032]"), " "); - writer.writeOptionalTextElement("cmt", desc); + writer->writeOptionalTextElement("cmt", desc); if (waypointp->notes && waypointp->notes[0]) { QString note = QString::fromUtf8(waypointp->notes); note = note.replace(QRegExp("[\014-\032]"), " "); - writer.writeTextElement("desc", note); + writer->writeTextElement("desc", note); } else { - writer.writeOptionalTextElement("desc", QString::fromUtf8(waypointp->description)); + writer->writeOptionalTextElement("desc", QString::fromUtf8(waypointp->description)); } write_gpx_url(waypointp); - writer.writeOptionalTextElement("sym", waypointp->icon_descr); + writer->writeOptionalTextElement("sym", waypointp->icon_descr); } static void @@ -1684,9 +1690,9 @@ gpx_waypt_pr(const waypoint* waypointp) fs_xml* fs_gpx; garmin_fs_t* gmsd; /* gARmIN sPECIAL dATA */ - writer.writeStartElement("wpt"); - writer.writeAttribute("lat", toString(waypointp->latitude)); - writer.writeAttribute("lon", toString(waypointp->longitude)); + writer->writeStartElement("wpt"); + writer->writeAttribute("lat", toString(waypointp->latitude)); + writer->writeAttribute("lon", toString(waypointp->longitude)); oname = global_opts.synthesize_shortnames ? mkshort_from_wpt(mkshort_handle, waypointp) : @@ -1710,7 +1716,7 @@ gpx_waypt_pr(const waypoint* waypointp) } else { gpx_write_common_extensions(waypointp, gpxpt_waypoint); } - writer.writeEndElement(); + writer->writeEndElement(); } static void @@ -1719,11 +1725,11 @@ gpx_track_hdr(const route_head* rte) fs_xml* fs_gpx; current_trk_head = rte; - writer.writeStartElement("trk"); - writer.writeOptionalTextElement("name", QString::fromUtf8(rte->rte_name)); - writer.writeOptionalTextElement("desc", QString::fromUtf8(rte->rte_desc)); + writer->writeStartElement("trk"); + writer->writeOptionalTextElement("name", QString::fromUtf8(rte->rte_name)); + writer->writeOptionalTextElement("desc", QString::fromUtf8(rte->rte_desc)); if (rte->rte_num) { - writer.writeTextElement("number", QString::number(rte->rte_num)); + writer->writeTextElement("number", QString::number(rte->rte_num)); } if (gpx_wversion_num > 10) { @@ -1746,24 +1752,24 @@ gpx_track_disp(const waypoint* waypointp) if (waypointp->wpt_flags.new_trkseg) { if (!first_in_trk) { - writer.writeEndElement(); + writer->writeEndElement(); } - writer.writeStartElement("trkseg"); + writer->writeStartElement("trkseg"); } - writer.writeStartElement("trkpt"); - writer.writeAttribute("lat", toString(waypointp->latitude)); - writer.writeAttribute("lon", toString(waypointp->longitude)); + writer->writeStartElement("trkpt"); + writer->writeAttribute("lat", toString(waypointp->latitude)); + writer->writeAttribute("lon", toString(waypointp->longitude)); gpx_write_common_position(waypointp); /* These were accidentally removed from 1.1 */ if (gpx_wversion_num == 10) { if WAYPT_HAS(waypointp, course) { - writer.writeTextElement("course", toString(waypointp->course)); + writer->writeTextElement("course", toString(waypointp->course)); } if WAYPT_HAS(waypointp, speed) { - writer.writeTextElement("speed", toString(waypointp->speed)); + writer->writeTextElement("speed", toString(waypointp->speed)); } } @@ -1786,17 +1792,17 @@ gpx_track_disp(const waypoint* waypointp) } else { gpx_write_common_extensions(waypointp, gpxpt_track); } - writer.writeEndElement(); + writer->writeEndElement(); } static void gpx_track_tlr(const route_head* rte) { if (!QUEUE_EMPTY(¤t_trk_head->waypoint_list)) { - writer.writeEndElement(); + writer->writeEndElement(); } - writer.writeEndElement(); + writer->writeEndElement(); current_trk_head = NULL; } @@ -1811,12 +1817,12 @@ static void gpx_route_hdr(const route_head* rte) { fs_xml* fs_gpx; - writer.writeStartElement("rte"); - writer.writeOptionalTextElement("name", QString::fromUtf8(rte->rte_name)); - writer.writeOptionalTextElement("desc", QString::fromUtf8(rte->rte_desc)); + writer->writeStartElement("rte"); + writer->writeOptionalTextElement("name", QString::fromUtf8(rte->rte_name)); + writer->writeOptionalTextElement("desc", QString::fromUtf8(rte->rte_desc)); if (rte->rte_num) { - writer.writeTextElement("number", QString::number(rte->rte_num)); + writer->writeTextElement("number", QString::number(rte->rte_num)); } if (gpx_wversion_num > 10) { @@ -1834,9 +1840,9 @@ gpx_route_disp(const waypoint* waypointp) { const char* oname; fs_xml* fs_gpx; - writer.writeStartElement("rtept"); - writer.writeAttribute("lat", toString(waypointp->latitude)); - writer.writeAttribute("lon", toString(waypointp->longitude)); + writer->writeStartElement("rtept"); + writer->writeAttribute("lat", toString(waypointp->latitude)); + writer->writeAttribute("lon", toString(waypointp->longitude)); oname = global_opts.synthesize_shortnames ? mkshort_from_wpt(mkshort_handle, waypointp) : @@ -1853,13 +1859,13 @@ gpx_route_disp(const waypoint* waypointp) } else { gpx_write_common_extensions(waypointp, gpxpt_route); } - writer.writeEndElement(); + writer->writeEndElement(); } static void gpx_route_tlr(const route_head* rte) { - writer.writeEndElement(); // Close rte tag. + writer->writeEndElement(); // Close rte tag. } static @@ -1885,12 +1891,12 @@ gpx_write_bounds(void) track_disp_all(NULL, NULL, gpx_waypt_bound_calc); if (waypt_bounds_valid(&all_bounds)) { - writer.writeStartElement("bounds"); - writer.writeAttribute("minlat", toString(all_bounds.min_lat)); - writer.writeAttribute("minlon", toString(all_bounds.min_lon)); - writer.writeAttribute("maxlat", toString(all_bounds.max_lat)); - writer.writeAttribute("maxlon", toString(all_bounds.max_lon)); - writer.writeEndElement(); + writer->writeStartElement("bounds"); + writer->writeAttribute("minlat", toString(all_bounds.min_lat)); + writer->writeAttribute("minlon", toString(all_bounds.min_lon)); + writer->writeAttribute("maxlat", toString(all_bounds.max_lat)); + writer->writeAttribute("maxlon", toString(all_bounds.max_lon)); + writer->writeEndElement(); } } @@ -1923,27 +1929,27 @@ gpx_write(void) // to include just enough whitespace between and to pass // diff -w. It's here for now to shim compatibility with our zillion // reference files, but this blank link can go away some day. - writer.writeCharacters("\n"); + writer->writeCharacters("\n"); - writer.setAutoFormatting(true); - writer.writeStartElement("gpx"); - writer.writeAttribute("version", gpx_wversion); - writer.writeAttribute("creator", CREATOR_NAME_URL); - writer.writeAttribute("xmlns", QString("http://www.topografix.com/GPX/%1/%2").arg(gpx_wversion[0]).arg(gpx_wversion[2])); + writer->setAutoFormatting(true); + writer->writeStartElement("gpx"); + writer->writeAttribute("version", gpx_wversion); + writer->writeAttribute("creator", CREATOR_NAME_URL); + writer->writeAttribute("xmlns", QString("http://www.topografix.com/GPX/%1/%2").arg(gpx_wversion[0]).arg(gpx_wversion[2])); if (opt_humminbirdext || opt_garminext) { if (opt_humminbirdext) { - writer.writeAttribute("xmlns:h","http://humminbird.com"); + writer->writeAttribute("xmlns:h","http://humminbird.com"); } if (opt_garminext) { - writer.writeAttribute("xmlns:gpxx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"); - writer.writeAttribute("xmlns:gpxtpx", "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"); + writer->writeAttribute("xmlns:gpxx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"); + writer->writeAttribute("xmlns:gpxtpx", "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"); } } else { - writer.writeAttributes(gpx_namespace_attribute); + writer->writeAttributes(gpx_namespace_attribute); } if (gpx_wversion_num > 10) { - writer.writeStartElement("metadata"); + writer->writeStartElement("metadata"); } gpx_write_gdata(&gpx_global->name, "name"); gpx_write_gdata(&gpx_global->desc, "desc"); @@ -1961,14 +1967,14 @@ gpx_write(void) } gpsbabel::DateTime now = current_time(); - writer.writeTextElement("time", now.toPrettyString()); + writer->writeTextElement("time", now.toPrettyString()); gpx_write_gdata(&gpx_global->keywords, "keywords"); gpx_write_bounds(); if (gpx_wversion_num > 10) { - writer.writeEndElement(); + writer->writeEndElement(); } gpx_reset_short_handle(); @@ -1977,7 +1983,7 @@ gpx_write(void) gpx_route_pr(); gpx_reset_short_handle(); gpx_track_pr(); - writer.writeEndElement(); // Close gpx tag. + writer->writeEndElement(); // Close gpx tag. } diff --git a/gpsbabel/kml.cc b/gpsbabel/kml.cc index 05fb0d07c..ae39eddf9 100644 --- a/gpsbabel/kml.cc +++ b/gpsbabel/kml.cc @@ -68,8 +68,8 @@ static const char* posnfilename; static char* posnfilenametmp; static gbfile* ofd = NULL; -static QFile oqfile; -static gpsbabel::XmlStreamWriter* writer = new gpsbabel::XmlStreamWriter(oqfile); +static QFile* oqfile; +static gpsbabel::XmlStreamWriter* writer; typedef enum { kmlpt_unknown, @@ -437,8 +437,10 @@ kml_wr_init(const char* fname) * Reduce race conditions with network read link. */ ofd = gbfopen(fname, "w", MYNAME); - oqfile.open(ofd->handle.std, QIODevice::WriteOnly); + oqfile = new QFile; + oqfile->open(ofd->handle.std, QIODevice::WriteOnly); + writer = new gpsbabel::XmlStreamWriter(oqfile); writer->setAutoFormattingIndent(2); writer->setCodec("UTF-8"); } @@ -468,8 +470,13 @@ static void kml_wr_deinit(void) { writer->writeEndDocument(); - oqfile.close(); + delete writer; + writer = NULL; + oqfile->close(); + delete oqfile; + oqfile = NULL; gbfclose(ofd); + ofd = NULL; if (posnfilenametmp) { #if __WIN32__ @@ -478,7 +485,6 @@ kml_wr_deinit(void) #endif rename(posnfilenametmp, posnfilename); } - ofd = NULL; } static void @@ -646,7 +652,7 @@ void kml_output_trkdescription(const route_head* header, computed_trkdata* td) } QString hstring; - gpsbabel::XmlStreamWriter hwriter(hstring); + gpsbabel::XmlStreamWriter hwriter(&hstring); max_alt = fmt_altitude(td->max_alt, &max_alt_units); min_alt = fmt_altitude(td->min_alt, &min_alt_units); @@ -817,7 +823,7 @@ static void kml_output_description(const waypoint* pt) } QString hstring; - gpsbabel::XmlStreamWriter hwriter(hstring); + gpsbabel::XmlStreamWriter hwriter(&hstring); alt = fmt_altitude(pt->altitude, &alt_units); diff --git a/gpsbabel/src/core/xmlstreamwriter.h b/gpsbabel/src/core/xmlstreamwriter.h index 26534a476..a0239f410 100644 --- a/gpsbabel/src/core/xmlstreamwriter.h +++ b/gpsbabel/src/core/xmlstreamwriter.h @@ -28,8 +28,8 @@ namespace gpsbabel { class XmlStreamWriter : public QXmlStreamWriter { public: - XmlStreamWriter(QString& s) : QXmlStreamWriter(&s) {} - XmlStreamWriter(QFile& f) : QXmlStreamWriter(&f) {} + XmlStreamWriter(QString* s) : QXmlStreamWriter(s) {} + XmlStreamWriter(QFile* f) : QXmlStreamWriter(f) {} // Dont emit the attribute if there's nothing interesting in it. void writeOptionalAttribute(QString tag, QString value) { -- 2.30.2